﻿// Copyright (c) 2010. Eric Nelson  
// https://code.google.com/p/prompts/
// All rights reserved.
//     
// Redistribution and use in source and binary forms,   
// with or without modification, are permitted provided   
// that the following conditions are met:    
// * Redistributions of source code must retain the   
// above copyright notice, this list of conditions and   
// the following disclaimer.    
// * Redistributions in binary form must reproduce   
// the above copyright notice, this list of conditions   
// and the following disclaimer in the documentation   
// and/or other materials provided with the distribution.    
// * Neither the name of Eric Nelson nor the   
// names of its contributors may be used to endorse   
// or promote products derived from this software   
// without specific prior written permission.    
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND   
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,   
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF   
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE   
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR   
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,   
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,   
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR   
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS   
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,   
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING   
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF   
// SUCH DAMAGE.
// 
//     
// [This is the BSD license, see  
// http://www.opensource.org/licenses/bsd-license.php]  
using System;
using System.Collections.Generic;
using System.ServiceModel.Activation;
using Prompts.Service.PromptService.Infrastructure;
using Prompts.Service.ReportService;

namespace Prompts.Service.ReportCatalogService
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class ReportCatalogService : ReportingServicesClientBase, IReportCatalogService
    {
        private readonly IReportingService2005 _reportingService2005;
        private readonly string _rootPath;

        public ReportCatalogService(IReportingService2005 reportingService2005, string rootPath)
        {
            _reportingService2005 = reportingService2005;
            _rootPath = rootPath;
        }

        public ReportCatalogInfo GetReportCatalogInfo()
        {
            try
            {
                return TryReportingServicesOperation(() =>
                {
                    var itemInfosToReturn = GetCatalogItemInfos(_rootPath);
                    return new ReportCatalogInfo(itemInfosToReturn, false, string.Empty);
                });

            }
            catch (Exception e)
            {
                return new ReportCatalogInfo(new CatalogItemInfo[] { }, true, e.Message);
            }
        }

        private IEnumerable<CatalogItemInfo> GetCatalogItemInfos(string path)
        {
            var itemInfosToReturn = new List<CatalogItemInfo>();

            var catalogItems = _reportingService2005.ListChildren(path, false);

            if (catalogItems == null)
            {
                return itemInfosToReturn;
            }

            foreach (var catalogItem in catalogItems)
            {
                if (catalogItem.Type == ItemTypeEnum.Report)
                {
                    var itemInfo = new CatalogItemInfo(catalogItem.Name, catalogItem.Path, CatalogItemType.Report, null);
                    itemInfosToReturn.Add(itemInfo);
                }
                if (catalogItem.Type == ItemTypeEnum.Folder)
                {
                    var itemInfo = new CatalogItemInfo(catalogItem.Name, catalogItem.Path, CatalogItemType.Folder, null);
                    itemInfo.Children = GetCatalogItemInfos(itemInfo.Path);
                    itemInfosToReturn.Add(itemInfo);
                }
            }

            return itemInfosToReturn;
        }
    }
}
